pv-on-hvm: Signal crash to Xen tools when HVM guest panics.
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 13 Feb 2008 10:42:09 +0000 (10:42 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 13 Feb 2008 10:42:09 +0000 (10:42 +0000)
Attached patch adds a function to automatically dump core file when
guest linux on HVM domain panics, in the same way as PV domain.

I tested this patch with kernel 2.6.9 and 2.6.18 on both of x86 and
ia64 (to buid for ia64, some patches in the ia64 tree are needed) by
the following steps, and confirmed it works well:

1. Build xen-platform-pci.ko.
2. In /etc/xen/xend-config.sxp, set (enable-dump yes).
3. On guest linux, execute insmod:
   # insmod xen-platform-pci.ko
4. When guest linux panics, a core file is dumped.

Signed-off-by: Tetsu Yamamoto <yamamoto.tetsu@jp.fujitsu.com>
unmodified_drivers/linux-2.6/platform-pci/Kbuild
unmodified_drivers/linux-2.6/platform-pci/panic-handler.c [new file with mode: 0644]
unmodified_drivers/linux-2.6/platform-pci/platform-pci.c

index ab836e4d51e81389e8807f7dc88c90586c91cf92..de3e50bca0d5cbd17084bd1382b77e8470da700d 100644 (file)
@@ -7,6 +7,7 @@ EXTRA_CFLAGS += -I$(M)/platform-pci
 xen-platform-pci-objs := evtchn.o platform-pci.o gnttab.o xen_support.o
 xen-platform-pci-objs += features.o platform-compat.o
 xen-platform-pci-objs += reboot.o machine_reboot.o
+xen-platform-pci-objs += panic-handler.o
 
 xen-platform-pci-objs += ../xenbus/xenbus_comms.o
 xen-platform-pci-objs += ../xenbus/xenbus_xs.o
diff --git a/unmodified_drivers/linux-2.6/platform-pci/panic-handler.c b/unmodified_drivers/linux-2.6/platform-pci/panic-handler.c
new file mode 100644 (file)
index 0000000..91bc035
--- /dev/null
@@ -0,0 +1,54 @@
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/notifier.h>
+#include <asm/hypervisor.h>
+
+MODULE_LICENSE("GPL");
+
+#ifdef __ia64__
+static void
+xen_panic_hypercall(struct unw_frame_info *info, void *arg)
+{
+       current->thread.ksp = (__u64)info->sw - 16;
+       HYPERVISOR_shutdown(SHUTDOWN_crash);
+       /* we're never actually going to get here... */
+}
+#endif
+
+static int
+xen_panic_event(struct notifier_block *this, unsigned long event, void *ptr)
+{
+#ifdef __ia64__
+       unw_init_running(xen_panic_hypercall, NULL);
+#else /* !__ia64__ */
+       HYPERVISOR_shutdown(SHUTDOWN_crash);
+#endif
+       /* we're never actually going to get here... */
+       return NOTIFY_DONE;
+}
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
+static struct notifier_block xen_panic_block = {
+       xen_panic_event, NULL, 0 /* try to go last */
+};
+#else
+static struct notifier_block xen_panic_block = {
+       .notifier_call= xen_panic_event,
+       .next= NULL,
+       .priority= 0/* try to go last */
+};
+#endif /*LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)*/
+
+static int __init setup_panic_event(void)
+{
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
+       notifier_chain_register(&panic_notifier_list, &xen_panic_block);
+#else
+       atomic_notifier_chain_register(&panic_notifier_list, &xen_panic_block);
+#endif /*LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)*/
+       return 0;
+}
+
+int xen_panic_handler_init(void)
+{
+       return setup_panic_event();
+}
index 7a512073d23aa944f50f8383f69dea368ece349a..3d3a4c79a15546be94368a2aa55174a25bbc2ac6 100644 (file)
@@ -249,6 +249,7 @@ static int set_callback_via(uint64_t via)
 int xen_irq_init(struct pci_dev *pdev);
 int xenbus_init(void);
 int xen_reboot_init(void);
+int xen_panic_handler_init(void);
 int gnttab_init(void);
 
 static int __devinit platform_pci_init(struct pci_dev *pdev,
@@ -317,6 +318,9 @@ static int __devinit platform_pci_init(struct pci_dev *pdev,
        if ((ret = xen_reboot_init()))
                goto out;
 
+       if ((ret = xen_panic_handler_init()))
+               goto out;
+
  out:
        if (ret) {
                release_mem_region(mmio_addr, mmio_len);